Seminário: Mapas Geográficos

EST0091 - COMPUTAÇÃO EM ESTATÍSTICA 2: R

ADRIELLY NUNES
GABRIEL HENRIQUE
GUILHERME CUNHA
MARCUS VINICIUS

Sumário

  • Dados espaciais

  • Leaflet

  • Googleway

  • Referências

Dados espaciais:

  • Pacotes
  • GEOBR
  • Shapefile
  • GeoJSON

Dados espaciais:

  • Pacotes
  • GEOBR
  • Shapefile
  • GeoJSON

Geobr

Geobr

Logo

Geobr

É um pacote para download de conjuntos de dados espaciais oficiais do Brasil. O pacote inclui uma ampla gama de dados geoespaciais em formato de geopacote (como shapefiles).

Exemplo

# Ler município específico em um determinado ano
mun <- geobr::read_municipality(code_muni = 5300108, year = 2017)
# 5300108 = Brasília
# Ler todos os municípios de um estado específico em um determinado ano
mun <- geobr::read_municipality(code_muni = 33, year = 2010) # ou
mun <- geobr::read_municipality(code_muni = "RJ", year = 2010)

# Ler todos os municípios do país em um determinado ano
mun <- geobr::read_municipality(code_muni = "all", year = 2018)

IBGE

Funções

Exemplos

Estados Brasileiros

library(ggplot2)
library(geobr)
estados <- geobr::read_state(
  year = 2019, 
  showProgress = FALSE
)

# Plotar todos os estados brasileiros
g1 <- ggplot() +
  geom_sf(data=estados, fill="#2D3E50", color="#FEBF57", size=.15, show.legend = FALSE) +
  labs(subtitle="Estados", size=8) +
  theme_minimal() 

Dados espaciais:

  • Pacotes
  • GEOBR
  • Shapefile
  • GeoJSON

Shapefile

O que é um Shapefile?

  • Formato popular para dados geoespaciais.
  • Armazena informações geométricas e atributos em múltiplos arquivos.
  • Normalmente composto por três arquivos principais: .shp, .shx, .dbf.

Como encontrar?

  • Sites de instituições geográficas/governo
  • Sites de banco de dados
  • Natural Earth (rnaturalearth)

Aplicação no R

  • Pacotes: Simple Features (sf) e ggplot2
  • Geometria: geom_sf

Funções principais

  • Ler dados espaciais: read_sf, st_read, etc
  • Operações geométricas: st_disjoint, st_intersects, etc
  • Visualização: geom_sf

Cheat Sheet

Aplicação

Banco de dados

  • Natural Earth
  • https://www.naturalearthdata.com/downloads/50m-cultural-vectors/
  • Contém várias informações referente aos países do mundo, incluindo a geometria.

Lendo o banco de dados

my_sf<- read_sf("dados_espaciais/shapefile/ne_50m_admin_0_countries/ne_50m_admin_0_countries.shp")

my_sf %>%
  select(SOVEREIGNT, POSTAL, CONTINENT, NAME_PT, ISO_A3,geometry) %>%
  head()
Simple feature collection with 6 features and 5 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -73.36621 ymin: -22.40205 xmax: 109.4449 ymax: 41.9062
Geodetic CRS:  WGS 84
# A tibble: 6 × 6
  SOVEREIGNT POSTAL CONTINENT     NAME_PT   ISO_A3                      geometry
  <chr>      <chr>  <chr>         <chr>     <chr>             <MULTIPOLYGON [°]>
1 Zimbabwe   ZW     Africa        Zimbábue  ZWE    (((31.28789 -22.40205, 31.19…
2 Zambia     ZM     Africa        Zâmbia    ZMB    (((30.39609 -15.64307, 30.25…
3 Yemen      YE     Asia          Iémen     YEM    (((53.08564 16.64839, 52.581…
4 Vietnam    VN     Asia          Vietname  VNM    (((104.064 10.39082, 104.083…
5 Venezuela  VE     South America Venezuela VEN    (((-60.82119 9.138379, -60.9…
6 Vatican    V      Europe        Vaticano  VAT    (((12.43916 41.89839, 12.430…
ggplot(my_sf) +
  geom_sf(fill = "#69b3a2", color = "white")+
  theme_minimal() 
library(rnaturalearth)
my_sf |>
  filter(CONTINENT == "South America") |>
  ggplot() +
  geom_sf(fill = "lightblue", color = "black") +
  geom_sf_text(aes(label = NAME_PT), size = 2)+
  theme_minimal()
library(ggplot2)

poluicao<- read_csv("dados_espaciais/shapefile/GCB2022v27_MtCO2_flat.csv") |>
  filter(Year > 2000) 

mapa_poluicao <- left_join(my_sf |>
                             select(ISO_A3, NAME_PT, geometry),
                           poluicao, by = c("ISO_A3" = "ISO 3166-1 alpha-3"))


mapa<- ggplot(data = mapa_poluicao) +
  geom_sf(aes(fill = Total)) +  
  scale_fill_viridis_c(option = "turbo") +  
  labs(title = "Quantidade de Poluição por País") +
  theme_minimal()

Dados espaciais:

  • Pacotes
  • GEOBR
  • Shapefile
  • GeoJSON

GeoJSON

GeoJSON

Introdução

  • GeoJSON é um formato para codificar uma variedade de estruturas de dados geográficos usando JavaScript Object Notation (JSON).
  • Um objeto GeoJSON pode representar uma região no espaço (Geometry), uma entidade espacialmente delimitada (Feature), ou uma lista de Features (FeatureCollection).

Objetos GeoJSON

Um objeto Geometry representa pontos, curvas, e superfíces em um espaço de coordenadas.

Tipos de objetos Geometry:

  • 0-dimensional: Point e MultiPoint

  • Unidimensional: LineString e MultiString

  • Bidimensional: Polygon e MultiPolygon

  • Um objeto Feature representa uma entidade espacialmente delimitada. Esse objeto é uma combinação de uma geometria (objeto Geometry) e de características (um objeto que contém um número de pares de propriedades).

  • Já um objeto FeatureCollection é um objeto que contém vários objetos Features em sua composição.

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [-105.01621, 39.57422]
      },
      "properties": {
        "name": "Ponto Exemplo"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "LineString",
        "coordinates": [
          [-105.01621, 39.57422],
          [-80.6665134, 35.0539943]
        ]
      },
      "properties": {
        "name": "Linha Exemplo"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [-105.01621, 39.57422],
            [-80.6665134, 35.0539943],
            [-80.6665134, 45.5699943],
            [-105.01621, 45.5699943],
            [-105.01621, 39.57422]
          ]
        ]
      },
      "properties": {
        "name": "Polígono Exemplo"
      }
    }
  ]
}

Geojson.io

  • Ferramenta online open source capaz de abrir arquivos GeoJSON existentes e/ou criar novos arquivos contendo dados geoespaciais.
  • Fornece ferramentas de desenho, edição de dados, busca e de exportação.

Geojson.io

Leaflet

Leaflet

Logo

Leaflet

  • Leaflet é uma das bibliotecas open source mais famosas para mapas iterativos.
  • Funciona eficientemente em todas as principais plataformas de desktop e móveis, pode ser estendido com muitos plugins, possui uma API fácil de usar e bem documentada, e um código-fonte simples e legível.

Características

  • Panorâmica e zoom iterativos.
  • Compor mapas com marcadores, polígonos, linhas, popups e dentro outros.
  • Incorporar mapas em documentos knitr/R Markdown/Quarto e aplicativos Shiny.
  • Renderizar facilmente objetos espaciais dos pacotes sp ou sf, ou data frames com colunas de latitude/longitude.

Mapa Estático da UnB

library(leaflet)
# lê o arquivo geojson como um objeto espacial "sp"
dados = geojsonio::geojson_read("dados_espaciais/geojson/pontos_unb.geojson", what = "sp")

# cria o mapa estático
mapa = leaflet(dados, options = leafletOptions(dragging = FALSE, 
                                               touchZoom = F, 
                                               doubleClickZoom = F, 
                                               zoomControl = F, 
                                               scrollWheelZoom = F)) %>%
  # adiciona os tiles do mapa 
  addTiles() %>%
  
  # adiciona os marcadores
  addMarkers(lng = dados@coords[,1], 
             lat = dados@coords[,2], 
             label = dados$nome,
             popup = dados$descricao)

Universidade de Brasília

Mapa Estático do Brasil

if(!file.exists("dados_espaciais/geojson/brasil.geojson")) {
  # cria o arquivo geojson a partir do arquivo json
  dados_brasil = st_read("dados_espaciais/geojson/brazil_geo.json/brazil_geo.json") %>%
    st_write("dados_espaciais/geojson/brasil.geojson", driver = "GEOJSON")
}

# lê o arquivo geojson como um objeto espacial "sp"
dados_brasil = geojsonio::geojson_read("dados_espaciais/geojson/brasil.geojson", what = "sp")

# paleta de cores para cada estado
cores = colorFactor(terrain.colors(length(dados_brasil$id)), dados_brasil$id)

# cria o mapa estático
mapa_b = leaflet(dados_brasil, options = leafletOptions(dragging = FALSE, 
                                               touchZoom = F, 
                                               doubleClickZoom = F, 
                                               zoomControl = F, 
                                               scrollWheelZoom = F)) %>%
  
  # adiciona os tiles do mapa com imagens de satélite
  addTiles(urlTemplate = "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",
           options = tileOptions(
             attribution = 'Tiles © Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community'
           )) %>%
  
  # adiciona os polígonos
  addPolygons(stroke = F,
              fillOpacity = 1,
              fillColor = ~cores(dados_brasil$id),
              label = dados_brasil$id,
              popup = dados_brasil$name)

Brasil

Mapas Iterativos

Câmeras de Segurança

library(sf)
library(dplyr)
library(purrr)
library(stringr)

# lê o arquivo geojson como um objeto espacial "sp"
dados_cameras = geojsonio::geojson_read("dados_espaciais/geojson/Cameras_de_Seguranca.geojson", what = "sp")

# converte as coordenadas UTM para latlog
coords = dados_cameras %>%
  as_tibble() %>%
  st_as_sf(coords = c("point_x","point_y"), 
           crs = "+proj=utm +zone=23 +south +datum=WGS84 +units=m +no_defs") %>%
  st_transform(crs = 4326) %>%
  st_coordinates()

# substitui as coordenadas UTM pelas coordenadas latlog
dados_cameras$point_x = coords[,"X"]
dados_cameras$point_y = coords[,"Y"]

# funcao que padroniza os popupinfo de cada camera
set_popup = function(popup) {
  popup = str_to_lower(popup) %>%
    str_trim()
  
  if(str_length(popup) == 0) return("N/A")
  
  if(str_detect(popup, "furtad") || str_detect(popup, "vandalizad")) return("Furtada/Vandalizada")
  else if(str_detect(popup, "não")) return("Não Instalada")
  
  return("Instalada")
}

# substitui para os popupinfo padronizado
dados_cameras$popupinfo = unlist(map(dados_cameras$popupinfo, set_popup))

# paleta de cores para cada estado da camera
pal = colorFactor(c("green", "orange", "red", "blue"), 
                  domain = c("Instalada", "Furtada/Vandalizada", "Não Instalada", "N/A"), ordered = T)

# cria o mapa
mapa_c = leaflet(dados_cameras) %>%
  
  # adiciona o tiles do mapa
  addTiles() %>%
  
  # define uma visão inicial
  setView(lng = -47.88281317652584, lat = -15.79409191690003, zoom = 12) %>%
  
  # adiciona os marcadores
  addCircleMarkers(lng = ~dados_cameras$point_x, 
                   lat = ~dados_cameras$point_y, 
                   label = ~dados_cameras$name, 
                   popup = ~dados_cameras$popupinfo, 
                   color = ~pal(dados_cameras$popupinfo),
                   radius = 6,
                   stroke = F,
                   fillOpacity = 0.6)

Câmeras de Segurança

Regiões Administrativas DF

if(!file.exists("dados_espaciais/geojson/regioes_adm_df.geojson")) {
  # cria o arquivo geojson a partir do arquivo json
  dados_brasil = st_read("dados_espaciais/geojson/regioes_adm_df.json") %>%
    st_write("dados_espaciais/geojson/regioes_adm_df.geojson", driver = "GEOJSON")
}

# lê o arquivo geojson como um objeto espacial "sp"
dados_regioes = geojsonio::geojson_read("dados_espaciais/geojson/regioes_adm_df.geojson", what = "sp")

# paleta de cores para cada região administrativa
cores = colorFactor("Paired", dados_regioes$id)

# cria o mapa
mapa_df = leaflet(dados_regioes) %>%
  
  # adiciona os tiles
  addTiles() %>%
  
  # adiciona os polígonos
  addPolygons(stroke = T,
              fillOpacity = 0.75,
              smoothFactor = 0.5,
              color = "black",
              weight = 1,
              opacity = 1,
              fillColor = ~cores(dados_regioes$id),
              label = dados_regioes$ra)

Regiões Administrativas DF

Regiões Administraticas DF x Câmeras de Segurança

mapa_l = leaflet() %>%
  addTiles() %>%
  addCircleMarkers(data = dados_cameras,
                   lng = dados_cameras$point_x, 
                   lat = dados_cameras$point_y, 
                   label = dados_cameras$name, 
                   popup = dados_cameras$popupinfo, 
                   color = ~pal(dados_cameras$popupinfo),
                   radius = 6,
                   group = "Câmeras",
                   stroke = F,
                   fillOpacity = 0.6,
                   clusterOptions = markerClusterOptions()) %>%
  
  addPolygons(data = dados_regioes,
              stroke = T,
              fillOpacity = 0.75,
              smoothFactor = 0.5,
              color = "black",
              weight = 1,
              opacity = 1,
              fillColor = ~cores(dados_regioes$id),
              label = dados_regioes$ra,
              group = "Regiões") %>%
  
  # Controle das Camadas do mapa
  addLayersControl(
    overlayGroups = c("Câmeras", "Regiões"),
    options = layersControlOptions(collapsed = F)
  )

Regiões Administraticas DF x Câmeras de Segurança

Googleway

Googleway

Googleway

  • Fornece acesso às APIs do Google Maps e a capacidade de plotar um mapa interativo do Google sobreposto com várias camadas e formas.
  • Nele se inclui marcadores, círculos, retângulos, polígonos, linhas (polilinhas) e mapas de calor, além da possibilidade de sobrepor informações sobre o trânsito.
  • Dependendo da API dentro do pacote a ser utilizada, é necessário uma chave de API válida para utilizar a maioria das funções.

Exemplo

# chave
chave <- "AIzaSyC78zbXYMb-7nD8R-YiGruRRXicfsdhqiY"

# setup das chaves
set_key(chave) # google way
register_google(key=chave) # ggmap

endereco <- "Torre de TV, Brasilia, Brasil"
lugar <- geocode(endereco)


# Mapa básico com ggmap
mapa1 <- ggmap::get_map(location = c(lon = lugar$lon, lat = lugar$lat), zoom = 15) 

Exemplo

Exemplos de API’s

Google Directions API

  • Permite que o usuário ache direções entre localizações.
set_key(chave) # google way
register_google(key=chave) # ggmap

direcao <- google_directions(origin = "BSAN Bloco de Salas de Aula Norte, UNB, Brasília, Brasil",
                             destination = "BSAS Bloco de Salas de Aula Sul, UNB, Brasília, Brasil",
                             key = chave,
                             mode = "driving") #mode:   string One of 'driving', 'walking', 'bicycling' or 'transit'.

pontos <- geocode("BSAN Bloco de Salas de Aula Norte, UNB, Brasília, Brasil") %>%
  bind_rows(geocode("BSAS Bloco de Salas de Aula Sul, UNB, Brasília, Brasil"))

rota <- decode_pl(direcao$routes$overview_polyline$points)

mapa2<- get_map(location = c(lon = mean(rota$lon), lat = mean(rota$lat)), zoom = 15)

Google Directions API

Google Geocode API

  • Fornece geocodificação e geocodificação reversa de endereços.
df <- google_geocode(address = "Casa Almeria, Brasília",
                     key = chave)

knitr::kable(geocode_coordinates(df))
lat lng
-15.80640 -47.89403
-15.80732 -47.89311

Google Places API

  • Obtém dados do mesmo banco de dados usado pelo Google Maps e pelo Google+ Local. Places apresenta mais de 100 milhões de empresas e pontos de interesse que são atualizados frequentemente.
## Por texto
texto <- google_places(search_string = "Mercados na asa norte, brasilia, Brasil",
                      key = chave,
                      language = "pt-BR")

# idiomas: https://developers.google.com/maps/faq#languagesupport
resultados_texto <- texto[["results"]]

mapa3<- get_map(location = c(lon = mean(resultados_texto$geometry$location$lng), lat = mean(resultados_texto$geometry$location$lat)), zoom = 14) %>%
  ggmap() +
  geom_point(data = resultados_texto, aes(x = geometry$location$lng, y = geometry$location$lat), color = "red", size = 4)+
  theme_void()

Google Places API

Referências